home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Games / NetHack 3.1.3 / source / util / lev_comp.l < prev    next >
Encoding:
Lex Description  |  1993-08-01  |  7.7 KB  |  264 lines  |  [TEXT/R*ch]

  1. %{
  2. /*    SCCS Id: @(#)lev_lex.c    3.1    93/06/17    */
  3. /*    Copyright (c) 1989 by Jean-Christophe Collet */
  4. /* NetHack may be freely redistributed.  See license for details. */
  5.  
  6. #define LEV_LEX_C
  7.  
  8. #include "hack.h"
  9. #include "lev_comp.h"
  10. #include "sp_lev.h"
  11.  
  12. /* Most of these don't exist in flex, yywrap is macro and
  13.  * yyunput is properly declared in flex.skel.
  14.  */
  15. #if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER)
  16. int FDECL(yyback, (int *, int));
  17. int NDECL(yylook);
  18. int NDECL(yyinput);
  19. int NDECL(yywrap);
  20. int NDECL(yylex);
  21.     /* Traditional lexes let yyunput() and yyoutput() default to int;
  22.      * newer ones may declare them as void since they don't return
  23.      * values.  For even more fun, the lex supplied as part of the
  24.      * newer unbundled compiler for SunOS 4.x adds the void declarations
  25.      * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain
  26.      * int) while the bundled lex and the one with the older unbundled
  27.      * compiler do not.  To detect this, we need help from outside --
  28.      * sys/unix/Makefile.utl.
  29.      */
  30. # if defined(NeXT) || defined(SVR4)
  31. #  define VOIDYYPUT
  32. # endif
  33. # if !defined(VOIDYYPUT)
  34. #  if defined(POSIX_TYPES) && !defined(BOS) && !defined(HISX) && !defined(_M_UNIX)
  35. #   define VOIDYYPUT
  36. #  endif
  37. # endif
  38. # if !defined(VOIDYYPUT) && defined(WEIRD_LEX)
  39. #  if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1) 
  40. #   define VOIDYYPUT
  41. #  endif
  42. # endif
  43. # ifdef VOIDYYPUT
  44. void FDECL(yyunput, (int));
  45. void FDECL(yyoutput, (int));
  46. # else
  47. int FDECL(yyunput, (int));
  48. int FDECL(yyoutput, (int));
  49. # endif
  50. #endif    /* !FLEX_SCANNER && !FLEXHACK_SCANNER */
  51.  
  52. void FDECL(init_yyin, (FILE *));
  53. void FDECL(init_yyout, (FILE *));
  54.  
  55. #ifdef MICRO
  56. #undef exit
  57. extern void FDECL(exit, (int));
  58. #endif
  59.  
  60. /*
  61.  * This doesn't always get put in lev_comp.h
  62.  * (esp. when using older versions of bison).
  63.  */
  64. extern YYSTYPE yylval;
  65.  
  66. int line_number = 1, colon_line_number = 1;
  67.  
  68. /*
  69.  * This is *** UGLY *** but I can't think a better way to do it;
  70.  * I really need a huge buffer to scan maps...
  71.  * (This should probably be `#ifndef FLEX_SCANNER' since it's lex-specific.)
  72.  */
  73. #ifdef YYLMAX
  74. #undef YYLMAX
  75. #endif
  76. #define YYLMAX    2048
  77.  
  78. /*
  79.  *    This is a hack required by Michael Hamel to get things
  80.  *    working on the Mac.
  81.  */
  82. #if defined(applec) && !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER)
  83. #undef input
  84. #undef unput
  85. #define unput(c) { yytchar = (c); if (yytchar == 10) yylineno--; *yysptr++ = yytchar; }
  86. # ifndef YYNEWLINE
  87. # define YYNEWLINE 10
  88. # endif
  89.  
  90. char
  91. input()        /* Under MPW \n is chr(13)! Compensate for this. */
  92. {
  93.     if (yysptr > yysbuf) return(*--yysptr);
  94.     else {
  95.         yytchar = getc(yyin);
  96.         if (yytchar == '\n') {
  97.             yylineno++;
  98.             return(YYNEWLINE);
  99.         }
  100.         if (yytchar == EOF) return(0);
  101.         else            return(yytchar);
  102.     }
  103. }
  104. #endif    /* applec && !FLEX_SCANNER && !FLEXHACK_SCANNER */
  105.  
  106. %}
  107. %e 1500
  108. %p 5000
  109. %n 600
  110. %s MAPC
  111. %%
  112. <MAPC>ENDMAP    {
  113. #ifdef FLEX23_BUG
  114.           /*
  115.            * There is a bug in Flex 2.3 patch level < 6
  116.            * (absent in previous versions)
  117.            * that results in the following behaviour :
  118.            * Once you enter an yymore(), you never exit from it.
  119.            * This should do the trick!
  120.            */
  121.           extern int yy_more_len;
  122.  
  123.           yy_more_len = 0;
  124. #endif    /* FLEX23_BUG */
  125.           BEGIN(INITIAL);
  126.           yylval.map = (char *) alloc(yyleng-5);
  127.           strncpy(yylval.map, yytext,yyleng-6);
  128.           yylval.map[yyleng-6] = 0;
  129.           return MAP_ID;
  130.         }
  131. <MAPC>[-|}{+ABCISHKPLW\\#. ]*\n    { line_number++; yymore(); }
  132. ^#.*\n        { line_number++; }
  133. :        { colon_line_number = line_number; return ':'; }
  134. MESSAGE        return MESSAGE_ID;
  135. MAZE        return MAZE_ID;
  136. NOMAP        return NOMAP_ID;
  137. LEVEL        return LEVEL_ID;
  138. INIT_MAP    return LEV_INIT_ID;
  139. FLAGS        return FLAGS_ID;
  140. GEOMETRY    return GEOMETRY_ID;
  141. ^MAP\n        { BEGIN(MAPC); line_number++; }
  142. OBJECT        return OBJECT_ID;
  143. MONSTER        return MONSTER_ID;
  144. TRAP        return TRAP_ID;
  145. DOOR        return DOOR_ID;
  146. DRAWBRIDGE    return DRAWBRIDGE_ID;
  147. MAZEWALK    return MAZEWALK_ID;
  148. WALLIFY        return WALLIFY_ID;
  149. REGION        return REGION_ID;
  150. RANDOM_OBJECTS    return RANDOM_OBJECTS_ID;
  151. RANDOM_MONSTERS    return RANDOM_MONSTERS_ID;
  152. RANDOM_PLACES    return RANDOM_PLACES_ID;
  153. ALTAR        return ALTAR_ID;
  154. LADDER        return LADDER_ID;
  155. STAIR        return STAIR_ID;
  156. PORTAL        return PORTAL_ID;
  157. TELEPORT_REGION    return TELEPRT_ID;
  158. BRANCH        return BRANCH_ID;
  159. FOUNTAIN    return FOUNTAIN_ID;
  160. SINK        return SINK_ID;
  161. POOL        return POOL_ID;
  162. NON_DIGGABLE    return NON_DIGGABLE_ID;
  163. NON_PASSWALL    return NON_PASSWALL_ID;
  164. ROOM        return ROOM_ID;
  165. SUBROOM        return SUBROOM_ID;
  166. RANDOM_CORRIDORS    return RAND_CORRIDOR_ID;
  167. CORRIDOR    return CORRIDOR_ID;
  168. GOLD        return GOLD_ID;
  169. ENGRAVING    return ENGRAVING_ID;
  170. NAME        return NAME_ID;
  171. CHANCE        return CHANCE_ID;
  172. levregion    return LEV;
  173. open        { yylval.i=D_ISOPEN; return DOOR_STATE; }
  174. closed        { yylval.i=D_CLOSED; return DOOR_STATE; }
  175. locked        { yylval.i=D_LOCKED; return DOOR_STATE; }
  176. nodoor        { yylval.i=D_NODOOR; return DOOR_STATE; }
  177. broken        { yylval.i=D_BROKEN; return DOOR_STATE; }
  178. north        { yylval.i=W_NORTH; return DIRECTION; }
  179. east        { yylval.i=W_EAST; return DIRECTION; }
  180. south        { yylval.i=W_SOUTH; return DIRECTION; }
  181. west        { yylval.i=W_WEST; return DIRECTION; }
  182. random        { yylval.i = -1; return RANDOM_TYPE; }
  183. none        { yylval.i = -2; return NONE; }
  184. object        return O_REGISTER;
  185. monster        return M_REGISTER;
  186. place        return P_REGISTER;
  187. align        return A_REGISTER;
  188. left        { yylval.i=1; return LEFT_OR_RIGHT; }
  189. half-left    { yylval.i=2; return LEFT_OR_RIGHT; }
  190. center        { yylval.i=3; return CENTER; }
  191. half-right    { yylval.i=4; return LEFT_OR_RIGHT; }
  192. right        { yylval.i=5; return LEFT_OR_RIGHT; }
  193. top        { yylval.i=1; return TOP_OR_BOT; }
  194. bottom        { yylval.i=5; return TOP_OR_BOT; }
  195. lit        { yylval.i=1; return LIGHT_STATE; }
  196. unlit        { yylval.i=0; return LIGHT_STATE; }
  197. filled        { yylval.i=0; return FILLING; }
  198. unfilled    { yylval.i=1; return FILLING; }
  199. noalign        { yylval.i= AM_NONE; return ALIGNMENT; }
  200. law        { yylval.i= AM_LAWFUL; return ALIGNMENT; }
  201. neutral        { yylval.i= AM_NEUTRAL; return ALIGNMENT; }
  202. chaos        { yylval.i= AM_CHAOTIC; return ALIGNMENT; }
  203. peaceful    { yylval.i=1; return MON_ATTITUDE; }
  204. hostile        { yylval.i=0; return MON_ATTITUDE; }
  205. asleep        { yylval.i=1; return MON_ALERTNESS; }
  206. awake        { yylval.i=0; return MON_ALERTNESS; }
  207. m_feature    { yylval.i= M_AP_FURNITURE; return MON_APPEARANCE; }
  208. m_monster    { yylval.i= M_AP_MONSTER;   return MON_APPEARANCE; }
  209. m_object    { yylval.i= M_AP_OBJECT;    return MON_APPEARANCE; }
  210. sanctum        { yylval.i=2; return ALTAR_TYPE; }
  211. shrine        { yylval.i=1; return ALTAR_TYPE; }
  212. altar        { yylval.i=0; return ALTAR_TYPE; }
  213. up        { yylval.i=1; return UP_OR_DOWN; }
  214. down        { yylval.i=0; return UP_OR_DOWN; }
  215. false        { yylval.i=0; return BOOLEAN; }
  216. true        { yylval.i=1; return BOOLEAN; }
  217. dust        { yylval.i=DUST; return ENGRAVING_TYPE; }
  218. engrave        { yylval.i=ENGRAVE; return ENGRAVING_TYPE; }
  219. burn        { yylval.i=BURN; return ENGRAVING_TYPE; }
  220. mark        { yylval.i=MARK; return ENGRAVING_TYPE; }
  221. blessed        { yylval.i=1; return CURSE_TYPE; }
  222. uncursed    { yylval.i=2; return CURSE_TYPE; }
  223. cursed        { yylval.i=3; return CURSE_TYPE; }
  224. noteleport    { yylval.i=NOTELEPORT; return FLAG_TYPE; }
  225. hardfloor    { yylval.i=HARDFLOOR; return FLAG_TYPE; }
  226. nommap        { yylval.i=NOMMAP; return FLAG_TYPE; }
  227. shortsighted    { yylval.i=SHORTSIGHTED; return FLAG_TYPE; }
  228. [+\-]?[0-9]+    { yylval.i=atoi(yytext); return INTEGER; }
  229. \"[^"]*\"    { yytext[yyleng-1] = 0; /* Discard the trailing \" */
  230.           yylval.map = (char *) alloc(strlen(yytext+1)+1);
  231.           strcpy(yylval.map, yytext+1); /* Discard the first \" */
  232.           return STRING; }
  233. \n        { line_number++; }
  234. [ \t]+        ;
  235. '.'        { yylval.i = yytext[1]; return CHAR; }
  236. .        { return yytext[0]; }
  237. %%
  238. #ifdef    AMIGA
  239. long *alloc(n)
  240.     unsigned n;
  241. {
  242.     return ((long *)malloc (n));
  243. }
  244. #endif
  245.  
  246. /* routine to switch to another input file; needed for flex */
  247. void init_yyin( input_f )
  248. FILE *input_f;
  249. {
  250. #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
  251.     if (yyin)
  252.         yyrestart(input_f);
  253.     else
  254. #endif
  255.         yyin = input_f;
  256. }
  257. /* analogous routine (for completeness) */
  258. void init_yyout( output_f )
  259. FILE *output_f;
  260. {
  261.     yyout = output_f;
  262. }
  263.  
  264.